/******************************************************************************
* 文件名称: list.c
* 内容摘要: 链表
* 创建者の: 孔佳伟
* 个人主页: https://gitee.com/openes
* 修改记录: 
******************************************************************************/

#include <list.h>


/******************************************************************************
* 函数名称: void ListInit(LIST* list)
* 功能说明: 链表初始化
* 输入参数: LIST* list	--链表　
* 输出参数: 无
* 函数返回: 无
* 其它说明: 无
******************************************************************************/
void ListInit(LIST* list)
{
    list->next = list;
    list->prev = list;
}

/******************************************************************************
* 函数名称: static void _ListAddNode(LIST_NODE* node, LIST_NODE* prev, LIST_NODE* next)
* 功能说明: 在 prev 和 next 节点中间插入 node 节点
* 输入参数: LIST_NODE* node       --节点
    　　　　LIST_NODE* prev       --节点
    　　　　LIST_NODE* next       --节点
* 输出参数: 无
* 函数返回: 无
* 其它说明: 无
******************************************************************************/
static void _ListAddNode(LIST_NODE* node, LIST_NODE* prev, LIST_NODE* next)
{
    next->prev = node;
    node->next = next;
    prev->next = node;
    node->prev = prev;
}

/******************************************************************************
* 函数名称: ListAddHead(LIST* list, LIST_NODE* node)
* 功能说明: 在链表头插入一个节点
* 输入参数: LIST* list        --链表
    　　　　LIST_NODE* node   --节点
* 输出参数: 无
* 函数返回: 无
* 其它说明: 无
******************************************************************************/
void ListAddHead(LIST* list, LIST_NODE* node)
{
    _ListAddNode(node, list, list->next);
}

/******************************************************************************
* 函数名称: void ListAddTail(LIST* list, LIST_NODE* node)
* 功能说明: 在链表尾插入一个节点
* 输入参数: LIST* list        --链表
    　　　　LIST_NODE* node   --节点
* 输出参数: 无
* 函数返回: 无
* 其它说明: 无
******************************************************************************/
void ListAddTail(LIST* list, LIST_NODE* node)
{
    _ListAddNode(node, list->prev, list);
}

/******************************************************************************
* 函数名称: void ListAddBefore(LIST_NODE* before, LIST* node)
* 功能说明: 在 before 节点前插入一个 node 节点
* 输入参数: LIST* before      --链表
    　　　　LIST_NODE* node   --节点
* 输出参数: 无
* 函数返回: 无
* 其它说明: 无
******************************************************************************/
void ListAddBefore(LIST_NODE* before, LIST_NODE* node)
{
    _ListAddNode(node, before->prev, before);
}

/******************************************************************************
* 函数名称: void ListAddAfter(LIST_NODE* after, LIST_NODE* node)
* 功能说明: 在 after 节点后插入一个 node 节点
* 输入参数: LIST* after       --链表
    　　　　LIST_NODE* node   --节点
* 输出参数: 无
* 函数返回: 无
* 其它说明: 无
******************************************************************************/
void ListAddAfter(LIST_NODE* after, LIST_NODE* node)
{
    _ListAddNode(node, after, after->next);
}

/******************************************************************************
* 函数名称: static void _ListDelNode(LIST_NODE* prev, LIST_NODE* next)
* 功能说明: 删除 prev 和 next 节点中间的节点
* 输入参数: LIST_NODE* prev   --节点
    　　　　LIST_NODE* next   --节点
* 输出参数: 无
* 函数返回: 无
* 其它说明: 无
******************************************************************************/
static void _ListDelNode(LIST_NODE* prev, LIST_NODE* next)
{
    prev->next = next;
    next->prev = prev;
}

/******************************************************************************
* 函数名称: void ListDelNode(LIST_NODE* node)
* 功能说明: 删除 node 节点
* 输入参数: LIST_NODE* node   --节点
* 输出参数: 无
* 函数返回: 无
* 其它说明: 无
******************************************************************************/
void ListDelNode(LIST_NODE* node)
{
    _ListDelNode(node->prev, node->next);
    node->prev = NULL;
    node->next = NULL;
}

/******************************************************************************
* 函数名称: void ListReplaceNode(LIST_NODE* old, LIST_NODE* new)
* 功能说明: 把 old 节点替换成 new 节点
* 输入参数: LIST_NODE* old    --节点
    　　　　LIST_NODE* new    --节点
* 输出参数: 无
* 函数返回: 无
* 其它说明: 无
******************************************************************************/
void ListReplaceNode(LIST_NODE* old, LIST_NODE* new)
{
    new->next = old->next;
    new->next->prev = new;
    new->prev = old->prev;
    new->prev->next = new;

    old->prev = NULL;
    old->next = NULL;
}

/******************************************************************************
* 函数名称: BOOL ListIsLast(LIST* list, LIST_NODE* node)
* 功能说明: 判断 node 节点是否是链表最后的节点
* 输入参数: LIST* list        --链表
    　　　　LIST_NODE* node   --节点
* 输出参数: 无
* 函数返回: 0:否; 1:是
* 其它说明: 无
******************************************************************************/
BOOL ListIsLast(LIST* list, LIST_NODE* node)
{
    return (list == node->next);
}

/******************************************************************************
* 函数名称: BOOL ListIsEmpty(LIST* list)
* 功能说明: 判断链表是否为空
* 输入参数: LIST* list        --链表
* 输出参数: 无
* 函数返回: 0:否; 1:是
* 其它说明: 无
******************************************************************************/
BOOL ListIsEmpty(LIST* list)
{
    return (list->next == list->prev);   
}